---@module serviceConfig
--[[
    与华为云产品的service 要一一对应，mqtt会定时对该文件的内容进行属性上报
]] --
require "tool"

module(..., package.seeall)
local filePath = "/serviceConf.cnf" -- 保存的文件系统路径

local defconfig = {}
-- 初始化配置表
function initDevConfig()
    defconfig = {
        -- 与华为云的sensor服务保持一致
        sensor = {
            weightval = -888888, -- 重量 -999999 读写解析失败 ，不能读写-串口读写中
            weightHex = "", -- 返回的二进制
            devType = nvm.get("DEV_TYPE"), -- 返回设备连接类型
            status = '读写中'
        }
    }
end

---@class SENSORCLASS
---@field weightval number 料塔当前重量
---@field status string 串口读写状态

---@class ServiceConfigClass
---@field sensor SENSORCLASS 传感状态
---
---@type ServiceConfigClass
local data = {}

local function init()
    initDevConfig()
    if io.exists(filePath) then
        local dat, res, err = json.decode(io.readFile(filePath))
        if res then
            log.info("serviceConfig", "refresh success" .. filePath)
            -- 避免版本升级过程中添加了字段没作用
            data = tool.confTableMerge(dat, defconfig, nil)
        else
            data = tool.deepCopy(defconfig)
            log.error("serviceConfig",
                      "has not file" .. filePath .. ",err=" .. err)
        end
    else
        data = tool.deepCopy(defconfig)
    end
    defconfig = {}

    collectgarbage("collect")
end
-- 开机时先从文件系统读取
init()

-- 为了避免保存时改变data的指针导致其他任务获取不到，调用后需重启才会生效
local function saveNew(newdata)
    -- tool.print_dump(self.data)
    local jsondata = json.encode(newdata)
    -- log.info("testJson.encode",jsondata)
    io.writeFile(filePath, jsondata)
    jsondata = nil
    collectgarbage("collect")
end
-- 将data保存到文件系统中
function save() saveNew(data) end
-- 将文件系统中的数据清除
function delete()
    if io.exists(filePath) then
        local res = os.remove(filePath)
        if res then
            log.info("serviceConfig", "delete success file" .. filePath)
        else
            og.error("serviceConfig", "delete fail file" .. filePath)
        end
    end
end

-- 将当前数据以json的方式打印出来
function logjson() log.info("serviceConfig", "logjson==" .. json.encode(data)) end

---@return ServiceConfigClass
function getData() return data end

function setData(dat) data = dat end

-- 设置液位高 和距离
function setWeight(weightval, status, cmdbuf)
    log.info("set weight val", weightval, status)
    data.sensor.weightval = weightval
    data.sensor.status = status
    if cmdbuf ~= nil and cmdbuf ~= "" then
        if nvm.get("DEV_TYPE") == "DNQ" then
            data.sensor.weightHex = cmdbuf
        else
            data.sensor.weightHex = string.toHex(cmdbuf)
        end
        -- data.sensor.weightHex = string.toHex(cmdbuf)
    else
        data.sensor.weightHex = ""
    end

end

function setHex(cmdbuf)
    if cmdbuf ~= nil and cmdbuf ~= "" then
        data.sensor.weightHex = string.toHex(cmdbuf)
    else
        data.sensor.weightHex = ""
    end
end
